package pl.ps.wi.monitoring.station;

import java.sql.SQLException;

/**
 * @brief Klasa jest odpowiedzalna za uruchomienie konfiguratora. Implementuje interfejs Runnable. Wykorzystuje klasę LocalConfiguration w pakiecie pl.ps.wi.monitoring.station. do ustawienia konfiguracji
 */
public class Configuration implements Runnable {
	
	private DBConnector conn;
	private boolean run = true;
	private final Thread thread;
	private final LocalConfiuration conf;

/**
 * Konstruktor.
 * @param conn - obiekt, ktory odpowiada za połączenie z bazą danych. 
 * @param conf - obiekt, zawierający konfigurację lokalną.
 * przypisuje wartości zmiennym lokalnym: conn oraz conf, na podstawie których następuje połączenie z bazą danych i dostęp do konfiguracji lokalnej. Tworzony jest również wątek o nazwie:  Configuration Thread.
 * sens wywołania setUpdate opisany przy definicji tej funkcji. Krótko: zmusza watchdoga do wczytania danych z bazy danych.
 * @throws SQLException
 */	
	public Configuration(LocalConfiuration conf, DBConnector conn) throws SQLException {
		this.conn = conn;
		this.conf = conf;
		this.conn.setUpdate();
		thread = new Thread(this, "Configuration Thread");
	}

/**
 * Metoda run update'uje połączenie z bazą danych i wywołuje metody wczytujące konfigurację watchdoga, a następnie usypia wątek odpowiedzialny za pobieranie czasu timeout zapisanego w pliku konfiguracyjnym (metoda wykonuje się raz na jakiś czas, określony w monitoring.properties) 
 * conn.isUpdate == true tylko wtedy, gdy pole w tabeli "up" w bazie danych jest równe 1. 
 */	
	@Override
	public void run() {
		try {
			while (run) {
				if (conn.isUpdate())
				{
					System.out.println("Downloading data...");
					getPhonesConfiguration();
					readEigenfaces();
					System.out.println("System ready");
				}
				try {
					Thread.sleep(conf.getConfigurationTimeout());
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	/**
	* Wywołuje metodę setEvens() należącą do klasy DBConnector - a przez to - pobiera dane z BD.
	*/
	public void getPhonesConfiguration() {
		try {
			conn.setEvens();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	* Wywołuje metodę readEigenfaces() należącą do klasy DBConnector
	*/
	public void readEigenfaces() {
		try {
			conn.readEigenfaces();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	* Metoda uruchamia wątek
	*/
	public void start() {
		thread.start();
	}
	
	public void stop() {
		run = false;
		try { // wait for thread
			thread.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
